package TecMaster.Ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

import TecMaster.Cliente;
import TecMaster.Equipamentos.Equipamento;

/**
 * Classe responsavel pela tela de Relatorio da empresa.
 * 
 * @author Flavio Ramalho
 * 
 */
public class RelatorioEmpresa extends JFrame implements ActionListener {
	private static final long serialVersionUID = 1L;
	private JPanel panel;
	private JPanel panelTabela;
	private JScrollPane scrollTabela;
	private JTable tabela;
	private Opcoes opcoes;
	private JButton botaoConcluir;

	public RelatorioEmpresa(final Opcoes opcoes) {
		super("TecMaster - Relatorio Empresa");
		setIconImage(Toolkit.getDefaultToolkit().getImage(
				getClass().getResource("/imagens/TM.png")));
		this.opcoes = opcoes;
		panel = new JPanel(null);
		panel.setBackground(Color.LIGHT_GRAY);
		panelTabela = new JPanel();
		panelTabela.setBackground(Color.LIGHT_GRAY);
		scrollTabela = new JScrollPane();
		tabela = new JTable();
		tabela.setEnabled(false);

		botaoConcluir = new JButton("Concluir");
		botaoConcluir.setIcon(new ImageIcon(getClass().getResource(
				"/imagens/accept.png")));
		botaoConcluir.setBounds(185, 255, 100, 40);
		botaoConcluir.addActionListener(this);
		panel.add(botaoConcluir);

		setSize(500, 350);
		setLocationRelativeTo(null);
		setVisible(true);
		addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent evt) {
				opcoes.setVisible(true);
				dispose();
			}
		});
	}

	/**
	 * Tela com a tabela de equipamentos CONSERTADOS ordenados por data.
	 * 
	 * @param data
	 *            a data de conserto.
	 */
	public void porData(Calendar data) {
		String[] colunas = new String[4];
		List<Equipamento> listaEquipData = opcoes.getListaEquipData(data);
		colunas[0] = "Data de Saida";
		colunas[1] = "Equipamento";
		colunas[2] = "Data de Chegada";
		colunas[3] = "Codigo";

		panelTabela.setLayout(new GridLayout(1, 0));
		panelTabela.setBorder(new TitledBorder("Relatorio - Data"));
		tabela.setModel(new DefaultTableModel(new Object[][] {}, colunas));

		tabela.getColumnModel().getColumn(0).setPreferredWidth(113);
		tabela.getColumnModel().getColumn(0).setResizable(false);
		tabela.getColumnModel().getColumn(1).setPreferredWidth(115);
		tabela.getColumnModel().getColumn(1).setResizable(true);
		tabela.getColumnModel().getColumn(2).setPreferredWidth(124);
		tabela.getColumnModel().getColumn(2).setResizable(false);
		tabela.getColumnModel().getColumn(3).setPreferredWidth(94);
		tabela.getColumnModel().getColumn(3).setResizable(false);
		tabela.getTableHeader().setReorderingAllowed(false);
		tabela.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
		scrollTabela.setViewportView(tabela);

		panelTabela.add(scrollTabela);

		panel.add(panelTabela);
		panelTabela.setBounds(10, 10, 465, 230);

		getContentPane().add(panel, BorderLayout.CENTER);

		for (int i = 0; i < listaEquipData.size(); i++) {
			String[] lista = new String[4];
			lista[0] = new SimpleDateFormat("dd/MM/yyyy").format(listaEquipData
					.get(i).getDataDeSaida().getTime());
			lista[1] = listaEquipData.get(i).getClass().getCanonicalName()
					.substring(23);
			lista[2] = new SimpleDateFormat("dd/MM/yyyy").format(listaEquipData
					.get(i).getDataDeChegada().getTime());
			lista[3] = listaEquipData.get(i).getCodigo();
			DefaultTableModel dtm = (DefaultTableModel) tabela.getModel();
			dtm.addRow(lista);
		}
	}

	/**
	 * Tela com tabela de equipamentos na fila de espera.
	 */
	public void porEspera() {
		String[] colunas = new String[4];
		Map<Cliente, ArrayList<Equipamento>> listaDeEspera = opcoes
				.getListaDeEspera();

		colunas[0] = "Cliente";
		colunas[1] = "Equipamento";
		colunas[2] = "Estado";
		colunas[3] = "Codigo";

		panelTabela.setLayout(new GridLayout(1, 0));
		panelTabela.setBorder(new TitledBorder("Relatorio - Lista de Espera"));
		tabela.setModel(new DefaultTableModel(new Object[][] {}, colunas));

		tabela.getColumnModel().getColumn(0).setPreferredWidth(145);
		tabela.getColumnModel().getColumn(1).setPreferredWidth(145);
		tabela.getColumnModel().getColumn(1).setResizable(true);
		tabela.getColumnModel().getColumn(2).setPreferredWidth(100);
		tabela.getColumnModel().getColumn(2).setResizable(false);
		tabela.getColumnModel().getColumn(3).setPreferredWidth(60);
		tabela.getColumnModel().getColumn(3).setResizable(true);
		tabela.getTableHeader().setReorderingAllowed(false);
		tabela.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
		scrollTabela.setViewportView(tabela);

		panelTabela.add(scrollTabela);

		panel.add(panelTabela);
		panelTabela.setBounds(10, 10, 465, 230);

		getContentPane().add(panel, BorderLayout.CENTER);

		for (Cliente c : listaDeEspera.keySet()) {
			for (Equipamento e : listaDeEspera.get(c)) {
				String[] lista = new String[4];
				lista[0] = c.getNome();
				lista[1] = e.getClass().getCanonicalName().substring(23);
				lista[2] = e.getEstado().toString().replace("_", " ");
				lista[3] = e.getCodigo();
				DefaultTableModel dtm = (DefaultTableModel) tabela.getModel();
				dtm.addRow(lista);
			}
		}
	}

	/**
	 * Tela com equipamentos e os defeitos de maior ocorrencia.
	 * 
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public void porDefeito() throws FileNotFoundException, IOException {
		String[] colunas = new String[4];
		HashMap<Equipamento, Integer> listaDeDefeitos = opcoes
				.getListaDeMaioresDefeitos();

		colunas[0] = "Equipamento";
		colunas[1] = "Qtde de Defeitos";
		colunas[2] = "Defeito";
		colunas[3] = "Marca";

		panelTabela.setLayout(new GridLayout(1, 0));
		panelTabela.setBorder(new TitledBorder("Relatorio - Defeitos"));
		tabela.setModel(new DefaultTableModel(new Object[][] {}, colunas));

		tabela.getColumnModel().getColumn(0).setPreferredWidth(118);
		tabela.getColumnModel().getColumn(0).setResizable(false);
		tabela.getColumnModel().getColumn(1).setPreferredWidth(97);
		tabela.getColumnModel().getColumn(1).setResizable(true);
		tabela.getColumnModel().getColumn(2).setPreferredWidth(118);
		tabela.getColumnModel().getColumn(2).setResizable(false);
		tabela.getColumnModel().getColumn(3).setPreferredWidth(118);
		tabela.getColumnModel().getColumn(3).setResizable(false);
		tabela.getTableHeader().setReorderingAllowed(false);
		tabela.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
		scrollTabela.setViewportView(tabela);

		panelTabela.add(scrollTabela);

		panel.add(panelTabela);
		panelTabela.setBounds(10, 10, 465, 230);

		getContentPane().add(panel, BorderLayout.CENTER);

		for (Equipamento e : listaDeDefeitos.keySet()) {
			String[] lista = new String[4];
			lista[0] = e.getClass().getCanonicalName().substring(23);
			lista[1] = listaDeDefeitos.get(e).toString();
			lista[2] = e.getDefeito().toString().replace("_", " ");
			lista[3] = e.getMarca().toString();
			DefaultTableModel dtm = (DefaultTableModel) tabela.getModel();
			dtm.addRow(lista);
		}
	}

	/**
	 * Tela com tabela ordenada de equipamentos por garantia.
	 */
	public void porGarantia() {
		String[] colunas = new String[4];
		ArrayList<HashMap<Equipamento, Cliente>> listaDeGarantias = opcoes
				.getListaSeparadaPorGarantia();

		colunas[0] = "Garantia";
		colunas[1] = "Equipamento";
		colunas[2] = "Cliente";
		colunas[3] = "Codigo";

		panelTabela.setLayout(new GridLayout(1, 0));
		panelTabela.setBorder(new TitledBorder("Relatorio - Garantia"));
		tabela.setModel(new DefaultTableModel(new Object[][] {}, colunas));

		tabela.getColumnModel().getColumn(0).setPreferredWidth(75);
		tabela.getColumnModel().getColumn(0).setResizable(false);
		tabela.getColumnModel().getColumn(1).setPreferredWidth(100);
		tabela.getColumnModel().getColumn(1).setResizable(true);
		tabela.getColumnModel().getColumn(2).setPreferredWidth(200);
		tabela.getColumnModel().getColumn(3).setPreferredWidth(75);
		tabela.getColumnModel().getColumn(3).setResizable(false);
		tabela.getTableHeader().setReorderingAllowed(false);
		tabela.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
		scrollTabela.setViewportView(tabela);

		panelTabela.add(scrollTabela);

		panel.add(panelTabela);
		panelTabela.setBounds(10, 10, 465, 230);

		getContentPane().add(panel, BorderLayout.CENTER);

		for (HashMap<Equipamento, Cliente> mapaDeEquip : listaDeGarantias) {
			for (Equipamento e : mapaDeEquip.keySet()) {
				String[] lista = new String[4];
				lista[0] = e.stringGarantia();
				lista[1] = e.getClass().getCanonicalName().substring(23);
				lista[2] = mapaDeEquip.get(e).getNome();
				lista[3] = e.getCodigo();
				DefaultTableModel dtm = (DefaultTableModel) tabela.getModel();
				dtm.addRow(lista);
			}
		}
	}

	/**
	 * Tela com tabela de equipamentos do tipo passado como parametro.
	 * 
	 * @param classe
	 *            uma classe herdada de Equipamento.
	 */
	public void porTipo(Object classe) {
		String[] colunas = new String[4];
		Map<Cliente, ArrayList<Equipamento>> listaDeTipo = opcoes
				.getListaDeTipo(classe);

		colunas[0] = "Equipamento";
		colunas[1] = "Cliente";
		colunas[2] = "Estado";
		colunas[3] = "Codigo";

		panelTabela.setLayout(new GridLayout(1, 0));
		panelTabela.setBorder(new TitledBorder(
				"Relatorio - Tipo de Equipamento"));
		tabela.setModel(new DefaultTableModel(new Object[][] {}, colunas));

		tabela.getColumnModel().getColumn(0).setPreferredWidth(100);
		tabela.getColumnModel().getColumn(0).setResizable(false);
		tabela.getColumnModel().getColumn(1).setPreferredWidth(194);
		tabela.getColumnModel().getColumn(1).setResizable(true);
		tabela.getColumnModel().getColumn(2).setPreferredWidth(100);
		tabela.getColumnModel().getColumn(2).setResizable(false);
		tabela.getColumnModel().getColumn(3).setPreferredWidth(55);
		tabela.getColumnModel().getColumn(3).setResizable(false);
		tabela.getTableHeader().setReorderingAllowed(false);
		tabela.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
		scrollTabela.setViewportView(tabela);

		panelTabela.add(scrollTabela);

		panel.add(panelTabela);
		panelTabela.setBounds(10, 10, 465, 230);

		getContentPane().add(panel, BorderLayout.CENTER);

		for (Cliente c : listaDeTipo.keySet()) {
			for (Equipamento e : listaDeTipo.get(c)) {
				String[] lista = new String[4];
				lista[0] = e.getClass().getCanonicalName().substring(23);
				lista[1] = c.getNome();
				lista[2] = e.getEstado().toString().replace("_", " ");
				lista[3] = e.getCodigo();
				DefaultTableModel dtm = (DefaultTableModel) tabela.getModel();
				dtm.addRow(lista);
			}
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		dispose();
	}
}